import "reflect-metadata";
import {
  createConnection,
  getConnection,
  Not,
  LessThan,
  Like,
  getManager,
  getRepository,
} from "typeorm";
import { User } from "./entity/User";
import { UserExtend } from "./entity/UserExtend";
import { Posts } from "./entity/Posts";
import { Tags } from "./entity/Tags";

// -------------一般查询---------------
/** 
createConnection()
  .then(async (connection) => {
    // 1. find的基本使用
    const userRepo = connection.getRepository(User);
    // 查询全部数据
    // const result = await userRepo.find();

    // 条件查询
    // select
    let result = await userRepo.find({ select: ["id", "username"] });
    // where
    result = await userRepo.find({ where: { id: 1 } });

    // where 和 and
    result = await userRepo.find({
      where: { username: "Emma1", password: "123456" },
    });

    // where 和 or
    result = await userRepo.find({ where: [{ username: "Emma1" }, { id: 2 }] });

    // relations关系查询， 前提是要有外键关联关系
    result = await userRepo.find({ relations: ["userDetail"] });

    // 使用join
    result = await userRepo.find({
      join: {
        alias: "user",
        leftJoinAndSelect: {
          detail: "user.userDetail",
          posts: "user.posts",
        },
      },
    });

    // order 排序查询
    result = await userRepo.find({
      order: {
        id: "DESC", // id降序
        username: "ASC", // 名字升序
      },
    });

    // 分页查询
    // `skip`偏移(表示从哪里开始)
    // `take`查询多少条数据
    result = await userRepo.find({
      skip: 2,
      take: 2,
    });

    // 排除 Not
    result = await userRepo.find({
      username: Not("李六"),
    });

    // LessThan
    result = await userRepo.find({
      id: LessThan(2),
    });

    // Like
    result = await userRepo.find({
      username: Like("%Em%"),
    });

    // findAndCount
    const newRes = await userRepo.findAndCount();

    result = await userRepo.findByIds([1, 2]);

    console.log(result);
  })
  .catch((error) => console.log(error));

  */

// ----------QueryBuilder----------

// 获取queryBuilder的几种方式
/** 
createConnection()
  .then(async (connection) => {
    let user;
    // const user = await getConnection()
    //   .createQueryBuilder()
    //   .select(["user.id", "user.username"]) // 需要选择查询的字段，如果想要全部查询可以不加select
    //   .from(User, "user") // 从哪张表，并且定义别名为user
    //   .where("(user.id=:id)", { id: 1 }) // 过滤条件
    //   .getOne();

    // const user = await getConnection()
    //   .createQueryBuilder(User, "user") // 从哪张表，并且定义别名为user
    //   .select(["user.id", "user.username"]) // 需要选择查询的字段，如果想要全部查询可以不加select
    //   .where("(user.id=:id)", { id: 1 }) // 过滤条件
    //   .getMany();

    // user = await getManager()
    //   .createQueryBuilder(User, "user")
    //   .select("user")
    //   .where("(user.username=:username)", { username: "Emma1" })
    //   .getMany();

    user = await getRepository(User).createQueryBuilder("user").getMany();
    console.log(user);
  })
  .catch((error) => console.log(error));
*/

// 利用queryBuilder 实现增删改查

createConnection()
  .then(async (connection) => {
    let result;
    // 查询数据
    result = await getConnection()
      .createQueryBuilder(User, "user")
      .select(["user.id", "user.username"])
      // .where("(user.id)=:id", { id: 1 })
      // `LINK`模糊查询
      .where("user.username like :username", { username: "%Emma%" })
      .getOne();

    // 插入数据
    // result = await getConnection()
    //   .createQueryBuilder()
    //   .insert() // 插入数据时要指明插入到哪个实体类
    //   .into(User)
    //   .values([
    //     { username: "张三1", password: "1234" },
    //     { username: "李四1", password: "12345" },
    //   ])
    //   .execute();

    // 更新数据
    // result = await getConnection()
    //   .createQueryBuilder()
    //   .update(User)
    //   .set({ username: "哈哈哈" })
    //   .where("id=:id", { id: 1 })
    //   .execute();

    // 删除数据
    // result = await getConnection()
    //   .createQueryBuilder()
    //   .delete()
    //   .from(User)
    //   .where("id=:id", { id: 1 })
    //   .execute();

    // 创建关系查询
    // result = await getConnection()
    //   .createQueryBuilder(User, "user")
    //   //参数一： 定义字段  二： 实体类  三： 别名  四：条件
    //   .leftJoinAndMapMany("user.posts", Posts, "posts", "user.id=posts.userId")
    //   .getMany();

    // 查询数据方法
    /**
     * getOne getMany 查询一条或多条
     * getRawOne getRawMany  使用聚合函数的时候下查询一条或多条数据
     */
    // result = await getConnection()
    //   .createQueryBuilder(User, "user")
    //   // 使用了聚合函数就要使用getRawOne或者getRawMany方法
    //   .select("SUM(user.id)", "sum")
    //   .getRawOne();

    console.log(result);
  })
  .catch((error) => console.log(error));
